home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu083.dms / pu083.adf / Morse / morse-0309 (.txt) < prev    next >
AmigaBASIC Source Code  |  1989-06-09  |  12KB  |  530 lines

  1. REM MORSE CODE GENERATOR PROGRAM
  2. ' Original AmigaNET morse-0308 program by Bill Pursel. Renamed Morse-0309
  3. ' Revised by W1JT to correct speed formulas, increase range, correct
  4. '  error char < to 8 dots, and show ESC as exit option 9/25/88.  
  5. CLEAR, 30000
  6. RANDOMIZE TIMER
  7. SCREEN 1,640,200,4,2
  8. WINDOW 2,"MORSE-CODE",(0,0)-(631,186),0,1
  9.  
  10. PALETTE 0,0.2,0.2,0.2       'BLACK
  11. PALETTE 1,0.73,0.2,0    'FIRE ENGINE RED
  12. PALETTE 2,0.4,0.6,1     'DARK BLUE
  13. PALETTE 3,0.73,0.73,0.73 'GRAY
  14. PALETTE 4,0.8,0.8,0.13     'YELLOW
  15. PALETTE 5,0.33,0.67,0   'GREEN
  16. PALETTE 6,1,1,1       'WHITE
  17. PALETTE 7,0.8,0.6,0.53   'BROWN
  18. PALETTE 8,0.4,0.6,1
  19. WIDTH 80
  20. COLOR 0,2
  21. CLS
  22. WINDOW OUTPUT 2
  23.  
  24. Z=199
  25. FOR Y=Z TO 1 STEP -2:X=320
  26. LINE (X,Z)-(1,Y)
  27. NEXT
  28. Z=320
  29. FOR X=0 TO 639 STEP 2
  30. LINE (X,0)-(Z,199)
  31. NEXT
  32. Z=199
  33. FOR Y=0 TO Z STEP 2:X=320
  34. LINE (X,Z)-(640,Y)
  35. NEXT
  36.  
  37. DIM N1(50),CW$(50),DUR(50,8)
  38.  
  39. FOR I=1 TO 45
  40. READ N1(I),CW$(I)
  41. FOR J=1 TO N1(I)
  42. READ DUR(I,J)
  43. NEXT J:NEXT I
  44. LEFT=160:RIGHT=470
  45. FOR X=100 TO 15 STEP -1
  46. LINE (LEFT,X)-(RIGHT,X),0
  47. LEFT=LEFT-2:RIGHT=RIGHT+2
  48. NEXT
  49. COLOR 1,0
  50.  
  51. P=800          'INITIAL PITCH VALUE
  52. WPM=7          'INITIAL WORDS/MINUTE
  53. VOL=255        'INITIAL VOLUME
  54.  
  55. DEF FNRATIO (A,B,C) = (A-B)/(C-2)
  56. DEF FNVALUE (A,B,C,D) = ((A-B+1)/C)+D-1
  57.  
  58. PBW=600  'PITCH BAR WIDTH
  59. PBH=14   'PITCH BAR HEIGHT
  60. PBSX=14  'PITCH BAR START X VALUE
  61. PBSY=21  'PITCH BAR START Y VALUE
  62. PSR=399  'PITCH START RANGE
  63. PER=1200 'PITCH END RANGE
  64. PBR=FNRATIO(PER,PSR,PBW)
  65. PBI=FNVALUE(800,PSR,PBR,PBSX)
  66.  
  67. SBW=400  'SPEED BAR WIDTH
  68. SBH=14   'SPEED BAR HEIGHT
  69. SBSX=114 'SPEED BAR START X VALUE
  70. SBSY=21  'SPEED BAR START Y VALUE
  71. SSR=5   'SPEED START RANGE
  72. SER=40   'SPEED END RANGE
  73. SBR=FNRATIO(SER,SSR,SBW) 
  74. SBI=FNVALUE(7,SSR,SBR,SBSX)    
  75.  
  76. VBW=600  'VOLUME BAR WIDTH
  77. VBH=14   'VOLUME BAR HEIGHT
  78. VBSX=14  'VOLUME BAR START X VALUE
  79. VBSY=21  'VOLUME BAR START Y VALUE
  80. VSR=1    'VOLUME START RANGE
  81. VER=256  'VOLUME END RANGE
  82. VBR=FNRATIO(VER,VSR,VBW) 
  83. VBI=FNVALUE(255,VSR,VBR,VBSX)    
  84.  
  85. CALL CENTERSTRING(3,"M O R S E ")   
  86. CALL CENTERSTRING(4,"C O D E")
  87. CALL CENTERSTRING(5,"G E N E R A T O R") 
  88. CALL CENTERSTRING(7,"SELECT FUNCTION FROM PULLDOWN MENU")
  89. CALL CENTERSTRING(8,"USING RIGHT MOUSE BUTTON")
  90. CALL CENTERSTRING(11,"YOU MAY ALSO SELECT WHICH CHARACTERS YOU WISH TO ")
  91. CALL CENTERSTRING(12,"PRACTICE WITH FOR THE 'RANDOM RECEIVING PRACTICE' ")
  92. CALL CENTERSTRING(13,"AND THE 'RECEIVING QUIZ' FUNCTIONS...")
  93. CALL CENTERSTRING(15,"AND/OR ADJUST CONTROLS TO YOUR LIKING")
  94.  
  95. MENU 1,0,1,"FUNCTION"
  96. MENU 1,1,1,"  RANDOM RECEIVING PRACTICE"
  97. MENU 1,2,1,"  RECEIVING QUIZ           "
  98. MENU 1,3,1,"  KEYBOARD SENDING         "
  99. MENU 1,4,1,"  SOUND A TEXT FILE        "
  100. MENU 1,5,1,"  QUIT                     "
  101.  
  102. MENU 2,0,1,"CHARACTER USAGE"
  103. MENU 2,1,1,"  All ALPHA, NUM and SPECIAL"
  104. MENU 2,2,1,"  All ALPHABETIC       "
  105. MENU 2,3,1,"  All NUMERIC          "
  106. MENU 2,4,1,"  NUM 1 THRU 5         "
  107. MENU 2,5,1,"  NUM 6 THRU 0         "
  108. MENU 2,6,1,"  All SPECIAL          "
  109. MENU 2,7,1,"  A,E,I,M,N,T ONLY     "
  110. MENU 2,8,1,"  D,G,K,O,R   ONLY     "
  111. MENU 2,9,1,"  B,S,U,W     ONLY     "
  112. MENU 2,10,1,"  C,F,H,J     ONLY     "
  113. MENU 2,11,1,"  L,P,Q,V     ONLY     "
  114. MENU 2,12,1,"  X,Y,Z       ONLY     "
  115.  
  116. MENU 3,0,1,"CONTROLS"
  117. MENU 3,1,1,"  CHANGE PITCH (800HZ)      "
  118. MENU 3,2,1,"  CHANGE SPEED (7 WORDS/MIN)"
  119. MENU 3,3,1,"  CHANGE VOLUME (255)       "
  120.  
  121. MENU 4,0,1,"" 'TURN OFF BASIC MENU 4
  122.  
  123. MENU ON
  124.  
  125. FUNCT2=2:OLDFUNC2=2 'INDICATE DEFAULT CHARACTER USAGE
  126. GOSUB CHAR
  127.  
  128. MLOOP:
  129. ON MENU GOSUB START
  130. FOR X=1 TO 5:AN$=INKEY$:NEXT X
  131. B=MOUSE(0)
  132. SLEEP
  133. GOTO MLOOP
  134.  
  135. START:
  136. SELMENU = MENU(0)
  137. ON SELMENU GOSUB 100,200,300
  138. OLDMENU = SELMENU
  139. RETURN
  140.  
  141. 100 :
  142. CLS
  143. FUNCT=MENU(1)
  144. COLOR 3,0
  145. CLS
  146. ON FUNCT GOSUB RCV,TEST,KEYBD,FILEKEY,BYE
  147. OLDFUNC=FUNCT
  148. RETURN
  149.  
  150. 200 :
  151. COLOR 3,0
  152. CLS
  153. FUNCT2=MENU(1)
  154. GOSUB CHAR
  155. OLDFUNC2=FUNCT2
  156. RETURN
  157.  
  158. 300 :
  159. COLOR 3,0
  160. CLS
  161. FUNCT3=MENU(1)
  162. ON FUNCT3 GOSUB DOMOUSE,DOMOUSE,DOMOUSE
  163. OLDFUNC3=FUNCT3
  164. RETURN
  165.  
  166.  
  167. DOMOUSE:
  168. MENU OFF
  169. CLS
  170. B=MOUSE(0)
  171. IF FUNCT3=1 THEN GOSUB PITCHBAR
  172. IF FUNCT3=2 THEN GOSUB SPEEDBAR
  173. IF FUNCT3=3 THEN GOSUB VOLBAR
  174. CHKMOUSE:
  175. GOSUB MOUSER
  176. IF B=0 THEN GOTO CHKMOUSE
  177. IF FUNCT3=1 THEN LOCATE ((PBSY+PBH-1)/7)+2,1:PRINT"PITCH RESET/CHANGED":BEEP
  178. IF FUNCT3=2 THEN LOCATE ((SBSY+SBH-1)/7)+2,1:PRINT"SPEED RESET/CHANGED":BEEP
  179. IF FUNCT3=3 THEN LOCATE ((VBSY+VBH-1)/7)+2,1:PRINT"VOLUME RESET/CHANGED":BEEP
  180. B=MOUSE(0)
  181. MENU ON
  182. RETURN
  183.  
  184. MOUSER:
  185. B=MOUSE(0):X=MOUSE(1):Y=MOUSE(2)
  186. IF FUNCT3=1 AND B<>0 AND X>PBSX AND X<PBSX+PBW AND Y>PBSY AND Y<PBSY+PBH THEN GOSUB PITCHCTRL
  187. IF FUNCT3=2 AND B<>0 AND X>SBSX AND X<SBSX+SBW AND Y>SBSY AND Y<SBSY+SBH THEN GOSUB SPEEDCTRL
  188. IF FUNCT3=3 AND B<>0 AND X>VBSX AND X<VBSX+VBW AND Y>VBSY AND Y<VBSY+VBH THEN GOSUB VOLCTRL
  189. RETURN
  190.  
  191. PITCHBAR:
  192. LINE(PBSX,PBSY)-(PBSX+PBW-1,PBSY+PBH-1),1,B
  193. LOCATE ((PBSY+PBH-1)/7)+1,1
  194. PRINT "PITCH BAR"
  195. B=1:X=PBI:Y=PBSY+PBH-2:GOSUB PITCHCTRL
  196. RETURN
  197.  
  198. SPEEDBAR:
  199. LINE(SBSX,SBSY)-(SBSX+SBW-1,SBSY+SBH-1),1,B
  200. LOCATE ((SBSY+SBH-1)/7)+1,1
  201. PRINT "SPEED BAR"
  202. B=1:X=SBI:Y=SBSY+SBH-2:GOSUB SPEEDCTRL
  203. RETURN
  204.  
  205. VOLBAR:
  206. LINE(VBSX,VBSY)-(VBSX+VBW-1,VBSY+VBH-1),1,B
  207. LOCATE ((VBSY+VBH-1)/7)+1,1
  208. PRINT "VOLUME BAR"
  209. B=1:X=VBI:Y=VBSY+VBH-2:GOSUB VOLCTRL
  210. RETURN
  211.  
  212. PITCHCTRL:
  213. WHILE B<>0 AND X>PBSX AND X<PBSX+PBW-1 AND Y>PBSY AND Y<PBSY+PBH-1
  214.   LINE (PBSX+1,PBSY+1)-(PBSX+PBW-2,PBSY+PBH-2),0,BF
  215.   LINE (PBSX+1,PBSY+1)-(X,PBSY+PBH-2),3,BF
  216.   P=(X-PBSX+1)*PBR+PSR-1
  217.   LOCATE ((PBSY+PBH-1)/7)+1,11
  218.   PRINT USING">####HZ";P
  219.   PBI=X
  220.   B=MOUSE(0):X=MOUSE(1):Y=MOUSE(2)
  221. WEND
  222. RETURN
  223.  
  224. SPEEDCTRL:
  225. WHILE B<>0 AND X>SBSX AND X<SBSX+SBW-1 AND Y>SBSY AND Y<SBSY+SBH-1
  226.   LINE (SBSX+1,SBSY+1)-(SBSX+SBW-2,SBSY+SBH-2),0,BF
  227.   LINE (SBSX+1,SBSY+1)-(X,SBSY+SBH-2),3,BF
  228.   WPM=INT((X-SBSX+1)*SBR+SSR-1)
  229.   LOCATE ((SBSY+SBH-1)/7)+1,11
  230.   PRINT USING">## WORDS/MIN";WPM
  231.   SBI=X
  232.   B=MOUSE(0):X=MOUSE(1):Y=MOUSE(2)
  233. WEND
  234. IF WPM < 13 THEN CWPM = 13 :ELSE CWPM = WPM
  235. DOT=(21.84/CWPM) 'CALCULATE SPEED, DOT TIME
  236. DASH=DOT*3
  237. IF WPM >= 13 THEN ELE = DOT :ELSE ELE = (43.68 - 1.68 * WPM) / WPM
  238. RETURN
  239.  
  240. VOLCTRL:
  241. WHILE B<>0 AND X>VBSX AND X<VBSX+VBW-1 AND Y>VBSY AND Y<VBSY+VBH-1
  242.   LINE (VBSX+1,VBSY+1)-(VBSX+VBW-2,VBSY+VBH-2),0,BF
  243.   LINE (VBSX+1,VBSY+1)-(X,VBSY+VBH-2),3,BF
  244.   VOL=(X-VBSX+1)*VBR+VSR-1
  245.   LOCATE ((VBSY+VBH-1)/7)+1,12
  246.   PRINT USING">### VOLUME LEVEL";VOL
  247.   VBI=X
  248.   B=MOUSE(0):X=MOUSE(1):Y=MOUSE(2)
  249. WEND
  250. RETURN
  251.  
  252. CHAR:
  253. MENU 2,OLDFUNC2,1
  254. MENU 2,FUNCT2,2
  255. MENU OFF
  256. IF FUNCT2=1 THEN SW=1:SX=44:NR=44
  257. IF FUNCT2=2 THEN SW=1:SX=26:NR=26
  258. IF FUNCT2=3 THEN SW=27:SX=36:NR=10
  259. IF FUNCT2=4 THEN SW=27:SX=31:NR=5
  260. IF FUNCT2=5 THEN SW=32:SX=36:NR=5
  261. IF FUNCT2=6 THEN SW=37:SX=44:NR=8
  262. IF FUNCT2=7 THEN SW=1:SX=6:NR=6
  263. IF FUNCT2=8 THEN SW=7:SX=11:NR=5
  264. IF FUNCT2=9 THEN SW=12:SX=15:NR=4
  265. IF FUNCT2=10 THEN SW=16:SX=19:NR=4
  266. IF FUNCT2=11 THEN SW=20:SX=23:NR=4
  267. IF FUNCT2=12 THEN SW=24:SX=26:NR=3
  268. IF SELMENU = 2 THEN
  269.   PRINT:PRINT "CHARACTER SELECTION COMPLETED. SELECT NEW FUNCTION."
  270. END IF
  271. BEEP
  272. MENU ON
  273. RETURN
  274.  
  275. KEYBD:
  276. MENU 1,OLDFUNC,1
  277. MENU 1,3,2
  278. MENU OFF
  279. PRINT :PRINT "START TYPING. CLICK LEFT MOUSE BUTTON OR ESC TO END."
  280. PRINT " USE CHAR < FOR ERROR, CHAR [ FOR AR, CHAR ] FOR SK .":PRINT 
  281. GETAKEY:
  282. C$=INKEY$
  283. B=MOUSE(0)
  284. IF B=1 THEN BEEP:GOTO EXKEYBD  
  285. IF C$="" THEN GOTO GETAKEY
  286. C$=UCASE$(C$)
  287. SOUND P,ELE*3,0 'CHAR SPACE
  288. C=ASC(C$)
  289. IF C=27 THEN EXKEYBD
  290. FOR I=1 TO 45
  291.   IF CW$(I) = C$ THEN 
  292.     C=I
  293.     I=45
  294.   ELSE
  295.     C=45
  296.   END IF
  297. NEXT I
  298. GOSUB SOUNDIT
  299. PRINT CW$(C);
  300. GOTO GETAKEY
  301. EXKEYBD:
  302. CLS
  303. PRINT:PRINT"FUNCTION ENDED. SELECT NEW FUNCTION"
  304. MENU ON
  305. RETURN
  306.  
  307. RCV:
  308. MENU 1,OLDFUNC,1
  309. MENU 1,1,2
  310. MENU OFF
  311. PRINT:PRINT"CLICK LEFT MOUSE BUTTON OR ESC TO END."
  312. PRINT "CODE SPEED = ";INT(WPM);" WPM. TYPED CHAR < = ERROR, [ = AR, ] = SK .": PRINT
  313.  
  314. NGRP=1:PRINT" ";
  315. RAND:
  316. FOR D=1 TO 5
  317. C=(INT(RND*NR))+SW 'Generate random char
  318. GOSUB SOUNDIT
  319. SOUND P,ELE*3,0  'char space
  320. PRINT CW$(C);    'char print
  321. NEXT D
  322. SOUND P,ELE*7,0  '5 char word space
  323. PRINT" ";
  324. NGRP=NGRP+1
  325. IF NGRP=13 THEN PRINT: PRINT: NGRP=1: PRINT" ";
  326. IF NGRP<>0 THEN GOTO RCV2
  327.  
  328. RCV2:
  329. B=MOUSE(0)
  330. IF B=1 THEN BEEP:GOTO EXRCV 
  331. AN$=INKEY$
  332. IF AN$="" THEN GOTO RAND 
  333. AN=ASC(AN$)
  334. IF AN=27 THEN GOTO EXRCV 
  335. GOTO RAND
  336. EXRCV:
  337. CLS
  338. PRINT:PRINT"FUNCTION ENDED. SELECT NEW FUNCTION"
  339. MENU ON
  340. RETURN
  341.  
  342. TEST:
  343. THREE=1
  344. POSITION=1
  345. TOTAL=0
  346. WRONG=0
  347. MENU 1,OLDFUNC,1
  348. MENU 1,2,2 
  349. MENU OFF
  350. PRINT :PRINT "YOU GET THREE TRIES TO GUESS CORRECTLY!"
  351. PRINT :PRINT "CLICK LEFT MOUSE BUTTON OR ESC TO END."
  352. PRINT"CHARACTER SPEED = 13 WPM OR GREATER. CODE SPEED SET AT ";INT(WPM);"WPM."
  353. PRINT"TYPE CHAR < = ERROR, [ = AR, ] = SK ."
  354. PICKIT:
  355. C=(INT(RND*NR))+SW
  356. SEND:
  357. GOSUB SCOREIT
  358. TOTAL=TOTAL+1
  359. GOSUB SOUNDIT
  360. SOUND P,ELE*3,0
  361. LOCATE 15,1
  362. PRINT USING "ATTEMPT - # - ";THREE
  363. ANSWER:
  364. AN$=UCASE$(INKEY$)
  365. B=MOUSE(0)
  366. IF B=1 THEN BEEP:GOTO EXTEST 
  367. IF AN$="" THEN GOTO ANSWER
  368. AN=ASC(AN$)
  369. IF AN=27 THEN GOTO EXTEST
  370. LOCATE 12,POSITION:PRINT AN$;
  371. IF POSITION=77 THEN 
  372.   LOCATE 12,1
  373.   PRINT" "                                                                            "
  374.   POSITION=1
  375. END IF 
  376. IF AN$<>CW$(C) THEN
  377.   WRONG=WRONG+1
  378.   LOCATE 17,1
  379.   PRINT"                     ";
  380.   THREE=THREE+1
  381.   IF THREE<4 THEN  GOTO SEND
  382. END IF
  383. THREE=1
  384. IF AN$=CW$(C) THEN 
  385.   POSITION=POSITION+1
  386.   LOCATE 17,1
  387.   PRINT"LAST ONE WAS CORRECT";
  388. END IF
  389. GOTO PICKIT
  390. EXTEST:
  391. CLS
  392. PRINT:PRINT"FUNCTION ENDED. SELECT NEW FUNCTION"
  393. MENU ON
  394. RETURN
  395.  
  396. SCOREIT:
  397. IF TOTAL<>0 THEN
  398.   LOCATE 23,1:PRINT"SCORE = ";
  399.   PRINT USING "###.##";((100*((TOTAL-WRONG)/TOTAL)));
  400.   PRINT USING "     TOTAL TRIES = ###";TOTAL;
  401. END IF
  402. RETURN
  403.  
  404. SOUNDIT:
  405. FOR J=1 TO N1(C)
  406. IF DUR(C,J) = 1 THEN SOUND P,DOT,VOL
  407. IF DUR(C,J) = 3 THEN SOUND P,DASH,VOL
  408. IF DUR(C,J) = 0 THEN SOUND P,ELE*3,0
  409. SOUND P,ELE,0
  410. NEXT J
  411. RETURN
  412.  
  413. FILEKEY:
  414. MENU 1,OLDFUNC,1
  415. MENU 1,4,2
  416. MENU OFF
  417. PRINT :PRINT "SOUND TEXT FILE. "
  418. PRINT "PRESS ESC OR CLICK LEFT MOUSE BUTTON AND/OR PRESS RETURN TO END."
  419. PRINT "CODE SPEED SET AT ";INT(WPM);"WPM.";
  420. PRINT" CHAR < = ERROR, [ = AR, ] = SK ." 
  421. ON ERROR GOTO NTFND
  422. GOTO ASKFILE
  423. NTFND:
  424. RESUME ERRED
  425. ERRED:
  426. WINDOW 3,,(70,50)-(560,150),0,1
  427. WINDOW OUTPUT 3
  428. LOCATE 7,19
  429. PRINT "FILE ERROR - TRY AGAIN"
  430. PRINT
  431. LOCATE 9,22
  432. PRINT "PRESS ANY KEY..."
  433. CHKKEY:
  434. IF INKEY$<>"" THEN GOTO WINCLO
  435. GOTO CHKKEY
  436. WINCLO:
  437. WINDOW 2
  438. WINDOW CLOSE 3
  439. ASKFILE:
  440. INPUT "ENTER 'DRIVE:FILE NAME' ";INFYLE$
  441. B=MOUSE(0)
  442. IF B=1 THEN GOTO EXFILEKEY
  443. IF INFYLE$ = "" THEN EXFILEKEY
  444. OPEN INFYLE$ FOR INPUT AS #1
  445. INPUT "DISPLAY ALSO? (Y OR N) ";E$
  446. ' ENDY= 14/CWPM*1400
  447. WHILE NOT EOF(1)
  448. LINE INPUT #1,A$
  449. D$=A$
  450. FOR X=1 TO LEN(A$)
  451. B=MOUSE(0)
  452. IF B=1 THEN EXFILEKEY  
  453. B$=INKEY$
  454. C$=LEFT$(D$,1)
  455. C$=UCASE$(C$)
  456. SOUND P,ELE*3,0 'WAIT ONE DASH LENGTH.
  457. D$=MID$(D$,2)
  458. IF B$<>"" THEN B=ASC(B$)
  459. IF B=27 THEN EXFILEKEY
  460. FOR I=1 TO 45
  461.   IF CW$(I) = C$ THEN 
  462.     C=I
  463.     I=45
  464.   ELSE
  465.     C=45
  466.   END IF
  467. NEXT I
  468. GOSUB SOUNDIT
  469. SOUND P,ELE*3,0
  470. IF UCASE$(E$)="Y" THEN PRINT CW$(C);
  471. '  FOR Y=1 TO ENDY:NEXT Y
  472. NEXT X
  473. IF UCASE$(E$)="Y" THEN PRINT " "
  474. WEND
  475. EXFILEKEY:
  476. FOR X=1 TO 3000:NEXT X
  477. CLS
  478. CLOSE #1
  479. PRINT:PRINT"FUNCTION ENDED. SELECT NEW FUNCTION"
  480. BEEP
  481. MENU ON
  482. RETURN
  483.  
  484. BYE:
  485. WINDOW 3,,(70,50)-(560,150),0,1
  486. WINDOW OUTPUT 3
  487. LOCATE 7,19
  488. INPUT"EXIT BASIC (Y/N)";FIN$
  489. IF UCASE$(FIN$) = "Y" THEN GOTO ENDBYE
  490. WINDOW 2
  491. WINDOW CLOSE 3
  492. X=0:Y=186
  493. SQUEEZE:
  494. LINE (0,X+1)-(631,Y-1),1,B
  495. LINE (0,X)-(631,Y),3,B
  496. X=X+1:Y=Y-1
  497. IF X=Y THEN LINE (X,50)-(Y,50),3 :ELSE GOTO SQUEEZE
  498. ENDBYE:
  499. WINDOW 1
  500. BEEP
  501. WINDOW CLOSE 2
  502. SCREEN CLOSE 1
  503. MENU RESET
  504. IF UCASE$(FIN$)<>"Y" THEN END
  505. WINDOW CLOSE 3
  506. SYSTEM
  507.  
  508. SUB CENTERSTRING(ROW%,LIT$) STATIC
  509.   LOCATE ROW%,40-(LEN(LIT$)/2)
  510.   PRINT LIT$;
  511. END SUB
  512.  
  513. DATA 1,E,1,2,I,1,1,1,T,3,2,M,3,3,2,A,1,3,2,N,3,1
  514. DATA 3,D,3,1,1,3,G,3,3,1,3,K,3,1,3,3,O,3,3,3,3,R,1,3,1
  515. DATA 3,S,1,1,1,3,U,1,1,3,3,W,1,3,3,4,B,3,1,1,1
  516. DATA 4,C,3,1,3,1,4,F,1,1,3,1,4,H,1,1,1,1,4,J,1,3,3,3
  517. DATA 4,L,1,3,1,1,4,P,1,3,3,1,4,Q,3,3,1,3,4,V,1,1,1,3
  518. DATA 4,X,3,1,1,3,4,Y,3,1,3,3,4,Z,3,3,1,1,5,1,1,3,3,3,3
  519. DATA 5,2,1,1,3,3,3,5,3,1,1,1,3,3,5,4,1,1,1,1,3
  520. DATA 5,5,1,1,1,1,1,5,6,3,1,1,1,1,5,7,3,3,1,1,1
  521. DATA 5,8,3,3,3,1,1,5,9,3,3,3,3,1,5,0,3,3,3,3,3
  522. DATA 6,".",1,3,1,3,1,3,6,",",3,3,1,1,3,3
  523. DATA 6,"?",1,1,3,3,1,1,5,"/",3,1,1,3,1
  524. DATA 8,"<",1,1,1,1,1,1,1,1,5,"-",3,1,1,1,3
  525. DATA 5,"[",1,3,1,3,1,6,"]",1,1,1,3,1,3,1," ",0
  526. END
  527.  
  528.   
  529.  
  530.